<?php

namespace app\common\utils;

/**
 * 模板替换
 */
class Replacement
{
    /**
     * 模板值前缀
     * @var string
     */
    private static string $tplBegin = '{%';

    /**
     * 模板值后缀
     * @var string
     */
    private static string $tplEnd = '%}';

    /**
     * 设置模板值前缀,默认'{%'
     * @param string $tag 前缀
     * @return void
     */
    public static function setTplBegin(string $tag): void
    {
        self::$tplBegin = $tag;
    }

    /**
     * 设置模板值后缀,默认'{%}'
     * @param string $tag 后缀
     * @return void
     */
    public static function setTplEnd(string $tag): void
    {
        self::$tplEnd = $tag;
    }

    /**
     * 替换模板内容
     * @param array $data 替换数据 key:模板值 value:内容
     * @param string $templateFilename 模板文件
     * @return false|string
     */
    public static function replace(array $data, string $templateFilename): false|string
    {
        if (empty($data) || !file_exists($templateFilename)) {
            return false;
        }

        $contents = file_get_contents($templateFilename);
        if (false === $contents) {
            return false;
        }

        return str_replace(
            array_map(fn($v) => self::$tplBegin . $v . self::$tplEnd, array_keys($data)),
            $data,
            $contents
        );
    }

    /**
     * 写入模板内容
     * @param array $data 替换数据 key:模板值 value:内容
     * @param string $templateFilename 模板文件
     * @param string $writeFilename 写入文件
     * @param bool $isForce 是否强制写入
     * @return false|int
     */
    public static function write(array $data, string $templateFilename, string $writeFilename, bool $isForce = false): false|int
    {
        $dirname = dirname($writeFilename);
        if (!is_dir($dirname)) {
            mkdir($dirname, 0755, true);
        }

        $contents = self::replace($data, $templateFilename);
        if (false === $contents) {
            return false;
        }

        if (file_exists($writeFilename) && !$isForce) {
            return false;
        }

        return file_put_contents($writeFilename, $contents);
    }
}